#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int h[N], q[N];

int main() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> h[i];
  }

  int len = 0;
  q[0] = -1e9 - 10; // 初始化  保证第一次读入时li[i]>q[len]

  for (int i = 1; i <= n; i++) {
    int x = h[i];
    int l = 1, r = len;
    // 如果q末尾元素小于x，增长序列长度
    if (x > q[len]) {
      q[++len] = x;

    } else {
      // 如果q末尾元素大于x，二分找第一个大于等于x的值
      int t;
      while (l <= r) {
        int mid = l + r >> 1;
        if (q[mid] >= x) {
          t = r;
          r = mid - 1;
        } else
          l = mid + 1;
      }
      q[t] = x;
      // 二分后 r存第一个大于等于x的位置，用x替换
    }
  }
  cout << len; // 最后长度就是最长子序列长度
  return 0;
}